import java.util.concurrent.atomic.AtomicInteger;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        AtomicInteger counter = new AtomicInteger(0);

        // 线程任务
        Runnable task = () -> {
            for (int i = 0; i < 10_000; i++) {
                counter.incrementAndGet(); // 原子 ++
            }
        };

        Thread t1 = new Thread(task);
        Thread t2 = new Thread(task);
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(counter.get()); // 20000
    }

}
// 我们以AtomicInteger为例，它提供的主要操作有：

// 增加值并返回新值：int addAndGet(int delta)
// 加1后返回新值：int incrementAndGet()
// 获取当前值：int get()
// 用CAS方式设置：int compareAndSet(int expect, int update)

// Atomic类是通过无锁（lock-free）的方式实现的线程安全（thread-safe）访问。它的主要原理是利用了CAS：Compare and Set
// public int incrementAndGet(AtomicInteger var) {
//     int prev, next;
//     do {
//         prev = var.get();
//         next = prev + 1;
//     } while ( ! var.compareAndSet(prev, next));
//     return next;
// }

// CAS是指，在这个操作中，如果AtomicInteger的当前值是prev，那么就更新为next，返回true。
// 如果AtomicInteger的当前值不是prev，就什么也不干，返回false。
// 通过CAS操作并配合do ... while循环，即使其他线程修改了AtomicInteger的值，最终的结果也是正确的